/*================================================================
*   Copyright (C) 2020 Sangfor Ltd. All rights reserved.
*   
*   文件名称：main.cpp
*   创 建 者：Ann
*   创建日期：2020年07月20日
*   描    述：
*
================================================================*/

#include "SelectSvr.hpp"
#include "tcp_svr.hpp"

#define CHECK_RET(p) if(p!=true){return -1;}

int main()
{
    TcpSvr listen_ts;
    CHECK_RET(listen_ts.CreateSocket());
    CHECK_RET(listen_ts.Bind("0.0.0.0", 19997));
    CHECK_RET(listen_ts.Listen());

    SelectSvr ss;
    ss.AddFd(listen_ts.GetFd());

    while(1)
    {
        //std::vector<int> vec;
        std::vector<TcpSvr> vec;
        if(!ss.SelectWait(&vec))
        {
            continue;
        }

        for(size_t i = 0; i < vec.size(); i++)
        {
            //说明是侦听套接字
            if(vec[i].GetFd() == listen_ts.GetFd())
            {
                //保存的是客户端的地址信息
                struct sockaddr_in peeraddr;
                //为新连接创建TcpSvr类对象， 在这个类对象当中的成员变量中， 保存了新的套接字描述符
                TcpSvr peerts;
                listen_ts.Accept(&peerts, &peeraddr);

                printf("Have a new connection: [ip]=%s, [port]=%d\n", inet_ntoa(peeraddr.sin_addr), ntohs(peeraddr.sin_port));

                ss.AddFd(peerts.GetFd());
            }
            else
            {
                //新连接上面有数据到来了
                std::string buf;
                bool ret = vec[i].Recv(&buf);
                if(!ret)
                {
                    //1.从事件集合当中删除文件描述符
                    ss.DeleteFd(vec[i].GetFd());
                    //2.连接关闭掉
                    vec[i].Close();
                }
                printf("client send buf is [%s]\n", buf.c_str());
            }
        }
    }
    return 0;
}
